
int STBY = 6;       /* STBY为正常工作/待机状态控制引脚 */

int AIN1 = 7;
int AIN2 = 8;
int PWMA = 10;

int ENCODE = 3;     /* 电机测速编码器计数引脚 */

unsigned int count = 0;      /* 中断计数值 */
float t = 0;        /* 系统启动时间 */
float v = 0;        /* 计算得到的平均转速, 单位 r/min */

void setup()
{
  /* 设置引脚均为输出模式 */
  pinMode(STBY, OUTPUT);

  pinMode(AIN1, OUTPUT);
  pinMode(AIN2, OUTPUT);
  pinMode(PWMA, OUTPUT);

  /* 设置 PIN3 为外部中断引脚, 中断触发方式为双边沿触发 */
  attachInterrupt(digitalPinToInterrupt(ENCODE), PIN3ISR, CHANGE);

  Serial.begin(115200);

  /* 设置 TB6112 为正常工作模式 */
  digitalWrite(STBY, HIGH);

  /* 设置电机正转 */
  digitalWrite(AIN1, HIGH);
  digitalWrite(AIN2, LOW);
  analogWrite(PWMA, 128);
}

void loop()
{
  /* 获取当前时间, 单位 ms */
  t = millis();

  /* 打印中断计数值和计算得到的平均转速 */
  Serial.print("count = ");
  Serial.print(count);
  Serial.print(", v = ");

  /* count / 40 是因为测试码盘有20个孔, 因此转一圈, 输出 20 个脉冲, 上升沿+下降沿共有 40个/圈 */
  Serial.println((count / 40) / (t / 60000));
  delay(1000);
}

void PIN3ISR(void)
{
  count++;
}
